package br.uvv.sao.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.uvv.sao.domain.Aluno;
import br.uvv.sao.domain.AlunoOferta;
import br.uvv.sao.domain.Perfil;
import br.uvv.sao.enums.SituUsuario;
import br.uvv.sao.util.HibernateUtil;

public class AlunoDAO extends DAO {
	
	private static final long serialVersionUID = -4156884409362264466L;

	private String mensagemRetorno = "";

	public void salvar(Aluno alunoInstance){
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			alunoInstance.setSituacao(SituUsuario.Ativo);
			this.sessao.save(alunoInstance);
			this.transacao.commit();
			mensagemRetorno = "SUCESSO: Aluno '" + alunoInstance.getNomeCompleto() + "' criado com sucesso.";
		} catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void atualizar(Aluno alunoInstance){
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			this.sessao.update(alunoInstance);
			this.transacao.commit();
			mensagemRetorno = "SUCESSO: Aluno '" + alunoInstance.getNomeCompleto() + "' atualizado com sucesso.";
		} catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void excluir(Aluno alunoInstance){
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			this.sessao.delete(alunoInstance);
			this.transacao.commit();
			mensagemRetorno = "SUCESSO: Aluno '" + alunoInstance.getNomeCompleto() + "' removido com sucesso.";
		} catch(Exception e){
			e.printStackTrace();
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Aluno> listar(){
		List<Aluno> alunoList = null;
		try {
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Aluno.class);
			alunoList = (ArrayList<Aluno>) filtro.list();
			this.transacao.commit();
		} catch(Exception e){
			e.printStackTrace();
		}
		return alunoList;
	}
	
	public Aluno get(Long id){
		Aluno alunoInstance = null;
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Aluno.class);
			filtro.add(Restrictions.eq("id", id));
			alunoInstance = (Aluno) filtro.uniqueResult();
			this.transacao.commit();
		} catch(Exception e){
			e.printStackTrace();
		}
		return alunoInstance;
	}
	
	@SuppressWarnings("unchecked")
	public List<Aluno> filtrar(String nome){
		List<Aluno> alunoList = new ArrayList<Aluno>();
		try {
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Aluno.class);
			filtro.add(Restrictions.ilike("nomeCompleto", "%" + nome + "%"));
			filtro.add(Restrictions.eq("situacao", SituUsuario.Ativo));
			filtro.addOrder(Order.asc("nomeCompleto"));
			alunoList = filtro.list();
			this.transacao.commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return alunoList;
	}
	
	public Aluno findByEmail(String email){
		Aluno alunoInstance = new Aluno();
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Aluno.class);
			filtro.add(Restrictions.eq("email", email));
			filtro.setMaxResults(1);
			alunoInstance = (Aluno) filtro.uniqueResult();
			this.transacao.commit();
		} catch(Exception e){
			e.printStackTrace();
		}
		return alunoInstance;
	}

	public Aluno findByNome(String nomeCompleto) {
		Aluno alunoInstance = new Aluno();
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Aluno.class);
			filtro.add(Restrictions.eq("nomeCompleto", nomeCompleto));
			filtro.setMaxResults(1);
			alunoInstance = (Aluno) filtro.uniqueResult();
			this.transacao.commit();
		} catch(Exception e){
			e.printStackTrace();
		}
		return alunoInstance;
	}

	public String getMensagemRetorno() {
		return mensagemRetorno;
	}

	public void setMensagemRetorno(String mensagemRetorno) {
		this.mensagemRetorno = mensagemRetorno;
	}

	public Long listarUltimoIndice(){
		Long retorno = (long) 0;
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Aluno.class);
			filtro.setMaxResults(1);
			filtro.addOrder(Order.desc("id"));
			Aluno alunoInstance = (Aluno) filtro.uniqueResult();
			if(alunoInstance != null && alunoInstance.getId() != null && alunoInstance.getId() > 0){
				retorno = alunoInstance.getId();
			}
			this.transacao.commit();
		} catch(Exception e){
			e.printStackTrace();
		}
		return retorno;
	}
	
	@SuppressWarnings("unchecked")
	public List<Aluno> listar(String codigo, String nome, ArrayList<AlunoOferta> alunoOfertaList) {
		List<Aluno> alunoList = null;
		try {
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Aluno.class);
			if (alunoOfertaList != null)
				for (AlunoOferta ao : alunoOfertaList)
					filtro.add(Restrictions.ne("id", ao.getAluno().getId()));
			filtro.add(Restrictions.ilike("nomeCompleto", "%" + nome + "%"));
			filtro.add(Restrictions.ilike("matricula", "%" + codigo + "%"));
			filtro.addOrder(Order.asc("nomeCompleto"));
			alunoList = (ArrayList<Aluno>) filtro.list();
			this.transacao.commit();
		} catch(Exception e){
			e.printStackTrace();
		}
		return alunoList;
	}

	public Perfil getPerfilAluno() {
		Perfil perfilInstance = new Perfil();
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Perfil.class);
			filtro.add(Restrictions.eq("nome", "Aluno"));
			filtro.setMaxResults(1);
			perfilInstance = (Perfil) filtro.uniqueResult();
			System.out.println(perfilInstance.getId());
			this.transacao.commit();
		} catch(Exception e){
			e.printStackTrace();
		}
		return perfilInstance;
	}

	@SuppressWarnings("unchecked")
	public List<Perfil> listarPerfis() {
		List<Perfil> perfilList = null;
		try {
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Perfil.class);
			perfilList = (ArrayList<Perfil>) filtro.list();
			this.transacao.commit();
		} catch(Exception e){
			e.printStackTrace();
		}
		return perfilList;
	}
	
}